﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using System.Windows.Input;
using System.Collections.Specialized;

namespace produccion.vistamodelo
{
    class VMMantenimientodeSecciones : ViewModelBase
    {
        #region Campos
            private List<CLSMAESEC> _lisseccion = new List<CLSMAESEC>();
            private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        #endregion

        #region Constructor

            public VMMantenimientodeSecciones()
            {
                try
                {
                    consultarSecciones();
                    lissecciones.CollectionChanged += OnCollectionChanged;

                    if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                    {
                        MDOgeneral.conectar();
                    }
                    strTituloVentana = "Mantenimiento de secciones - Usuario: " + MDOgeneral.usuario + " - [frmMantenimientodeSecciones]";
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

        #endregion

        #region Interfaces publicas

            private string _strTituloVentana;
            public string strTituloVentana
            {
                get { return _strTituloVentana; }
                set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
            }

            public List<CLSMAESEC> lisseccion
            {
                get { return _lisseccion; }
                set { _lisseccion = value; base.OnPropertyChanged("lisseccion"); }
            }

            private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
            public MDOgeneral.mensaje msn
            {
                get { return _msn; }
                set { _msn = value; base.OnPropertyChanged("msn"); }
            }

            private ObservableCollection<VMSecciones> _lissecciones = new ObservableCollection<VMSecciones>();
            public ObservableCollection<VMSecciones> lissecciones
            {
                get { return _lissecciones; }
                set { _lissecciones = value; base.OnPropertyChanged("lissecciones"); }
            }

            private VMSecciones _selseccion;
            public VMSecciones selseccion
            {
                get { return _selseccion; }
                set { _selseccion = value; base.OnPropertyChanged("selseccion"); }
            }

            private Boolean _logValido;
            public Boolean logValido
            {
                get { return _logValido; }
                set { _logValido = value; base.OnPropertyChanged("logValido"); }
            }

        #endregion

        #region Comandos

            RelayCommand _cmdSalir;
            public ICommand cmdSalir
            {
                get
                {
                    if (_cmdSalir == null)
                    {
                        _cmdSalir = new RelayCommand(Salir); 
                    }
                    return _cmdSalir;
                }
            }

            RelayCommand _cmdEliminar;
            public ICommand cmdEliminar
            {
                get
                {
                    if (_cmdEliminar == null)
                    {
                        _cmdEliminar = new RelayCommand(r => eliminarSeccion());
                    }
                    return _cmdEliminar;
                }
            }

            RelayCommand _cmdGrabar;
            public ICommand cmdGrabar
            {
                get
                {
                    if (_cmdGrabar == null)
                    {
                        _cmdGrabar = new RelayCommand(r => grabarSeccion());
                    }
                    return _cmdGrabar;
                }
            }

        #endregion

        #region Metodos

            public void consultarSecciones()
            {
                try
                {
                    lisseccion = new CLSMAESEC().listarSecciones();
                    List<VMSecciones> all = (from sec in lisseccion select new VMSecciones(sec)).ToList();
                    foreach (VMSecciones sec in all)
                    {
                        sec.validarSeccion += validaSeccion;
                        sec.PropertyChanged += OnPropertyChanged;
                    }

                    lissecciones = new ObservableCollection<VMSecciones>(all);
                    lissecciones.CollectionChanged += OnCollectionChanged;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                try
                {
                    logValido = ((from sec in lissecciones where sec.IsValid.Equals(false) select sec.IsValid).ToList().Count()) > 0 ? true : false;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
            {
                try
                {
                    if (e.NewItems != null && e.NewItems.Count > 0)
                    {
                        foreach (VMSecciones sec in e.NewItems)
                        {
                            sec.validarSeccion += validaSeccion;
                            sec.PropertyChanged += OnPropertyChanged;
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public string validaSeccion(string strCodigoSeccion)
            {
                try
                {
                    int i = (from sec in lissecciones where sec.codsec_sec.Trim().Equals(strCodigoSeccion.Trim()) select sec).ToList().Count();
                    if (i > 1)
                    {
                        return "Código de sección ya existe.";
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }
    
            private void grabarSeccion()
            {
                try
                {
                    List<CLSMAESEC> lstAgregar = (from sec in lissecciones where sec.agregar.Equals(true) select sec.getSecciones()).ToList();
                    List<CLSMAESEC> lstActualizar = (from sec in lissecciones where sec.actualizar.Equals(true) select sec.getSecciones()).ToList();
                    List<CLSMAESEC> lstEliminar = (from sec in lissecciones where sec.eliminar.Equals(true) select sec.getSecciones()).ToList();

                    if (_repositorio.guardarSeccion(lstActualizar, lstEliminar, lstAgregar))
                    {
                        msn.texto = "La información de secciones fue guardada con exito";
                        msn.tipo = true;
                        consultarSecciones();
                    }
                    else
                    {
                        msn.texto = "La información de secciones no se pudo grabar.";
                        msn.tipo = false;
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void eliminarSeccion()
            {
                try
                {
                    if (selseccion.agregar)
                        lissecciones.Remove(selseccion);
                    else
                        selseccion.eliminar = !selseccion.eliminar;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            
            public void Salir(object frmformulario)
            {
                try
                {
                    ((Window)frmformulario).Close();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            

        #endregion
    }

    public class VMSecciones : ViewModelBase, IDataErrorInfo
    {
        #region Campos
            
            private CLSMAESEC _secciones = new CLSMAESEC();
            public delegate string validarCodigoSeccion(string codsec_sec);

        #endregion

        #region Constructor
                
            public VMSecciones(CLSMAESEC secciones)
            {
                _secciones = secciones;
            }

            public VMSecciones()
            {
                agregar = true;
                base.OnPropertyChanged("codsec_sec");
            }

        #endregion

        #region Metodos

            public CLSMAESEC getSecciones()
            {
                return _secciones;
            }

        #endregion

        #region Interfaces publicas

            public validarCodigoSeccion validarSeccion;    

            public string codsec_sec
            {
                get { return _secciones.CODSEC_SEC; }
                set 
                {
                    if (agregar == true)
                    {
                        _secciones.CODSEC_SEC = value;
                        base.OnPropertyChanged("codsec_sec");
                    }
                }
            }
            
            public string nomsec_sec
            {
                get { return _secciones.NOMSEC_SEC; }
                set 
                {
                    if (_secciones.NOMSEC_SEC != value && agregar == false)
                        actualizar = true;
                    _secciones.NOMSEC_SEC = value;
                    base.OnPropertyChanged("nomsec_sec");
                }
            }

            public string repman_sec//FJRF - Agregamos el campo nuevi (repman_sec)
            {
                get { return _secciones.REPMAN_SEC; }
                set
                {
                    if (_secciones.REPMAN_SEC != value && agregar == false)
                        actualizar = true;
                    _secciones.REPMAN_SEC = value;
                    base.OnPropertyChanged("repman_sec");
                }
            }

            private bool _actualizar = false;
            public bool actualizar
            {
                get { return _actualizar; }
                set { _actualizar = value; base.OnPropertyChanged("actualizar"); }
            }

            private bool _eliminar = false;
            public bool eliminar
            {
                get { return _eliminar; }
                set { _eliminar = value; base.OnPropertyChanged("eliminar"); }
            }

            private bool _agregar = false;
            public bool agregar
            {
                get { return _agregar; }
                set { _agregar = value; base.OnPropertyChanged("agregar"); }
            }

        #endregion

        #region IDataErrorInfo Members

            string IDataErrorInfo.Error { get { return null; } }

            string IDataErrorInfo.this[string propertyName]
            {
                get { return this.GetValidationError(propertyName); }
            }

        #endregion

        #region Validation

            /// <summary>
            /// Returns true if this object has no validation errors.
            /// </summary>
            /// 

            public bool IsValid
            {
                get
                {
                    foreach (string property in ValidatedProperties)
                        if (GetValidationError(property) != null)
                            return false;

                    return true;
                }
            }

            static readonly string[] ValidatedProperties = 
                    { 
                        "codsec_sec",
                        "nomsec_sec",
                        "repman_sec"//FJRF - Se agrega el nuevo campo
                    };

            string GetValidationError(string propertyName)
            {
                if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                    return null;

                string error = null;

                switch (propertyName)
                {
                    case "codsec_sec":
                        error = this.Validatecodigo();
                        break;
                    case "nomsec_sec":
                        error = this.ValidateNombre();
                        break;
                    case "repman_sec":
                        error = this.Validatemanual();//FJRF - validamos la nueva seccion (ValidateNombre)
                        break;
                    default:
                        Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                        break;
                }
                return error;
            }

            string Validatecodigo()
            {
                try
                {
                    if (codsec_sec == null) { return "Debe ingresar el código de la sección."; }
                    if (codsec_sec != null)
                    { 
                        if (codsec_sec.Length > 1) { return "El código de la sección no puede tener mas de 1 caracter"; }
                        string error = null;
                        error = validarSeccion(codsec_sec);
                        if (!String.IsNullOrEmpty(error))
                        {
                            return error;
                        }
                    }
                 
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateNombre()
            {
                try
                {
                    if (nomsec_sec == null) { return "Debe ingresar el nombre de la sección"; }
                    if (nomsec_sec != null)
                    {
                        if (nomsec_sec.Length > 30) { return "El nombre de la sección no puede tener mas de 30 caracteres"; }
                    }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string Validatemanual()//FJRF - Validamos el nuevo campo (repman_sec)
            {
                try
                {
                    if (repman_sec == null) { return "Debe ingresar el [S] para Si y [N] para no en la sección."; }
                    if (repman_sec != null)
                    {
                        if (repman_sec.ToUpper() == "S" || repman_sec.ToUpper() == "N")
                        { 
                        }
                        else
                        { 
                            return "El dato digitado solo debe ser una letra [S] o [N]"; 
                        }
                        if (repman_sec.Length > 1) { return "El dato digitado solo debe tener un [1] solo caracter"; }
                        string error = null;
                        error = validarSeccion(repman_sec);
                        if (!String.IsNullOrEmpty(error))
                        {
                            return error;
                        }
                    }

                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            #endregion
    }
}
